#include<func.h>
//通过共享内存，PV操作，实现加锁解锁，真正加到两千万
#define NUM 10000000

int main()
{
    int shmid;
    shmid=shmget(1000,4096,IPC_CREAT|0666);//创建共享内存
    ERROR_CHECK(shmid,-1,"shmget");
    printf("shmid=%d\n",shmid);
    int *p=shmat(shmid,NULL,0);//将共享内存连接到本程序内
    ERROR_CHECK(p,(char*)-1,"shmat");
    p[0]=0;
    int i;
    int sem_id=semget(1000,1,IPC_CREAT|0666);//，创建信号量，并给读取权限
    ERROR_CHECK(sem_id,-1,"semget");
    int ret=semctl(sem_id,0,SETVAL,1);//将信号量的值初始化为1
    ERROR_CHECK(ret,-1,"semctl");
    struct sembuf sopp,sopv;
    sopp.sem_num=0;//操作的是几号信号量
    sopp.sem_op=-1;//P操作
    sopp.sem_flg=0;
    sopv.sem_num=0;
    sopv.sem_op=1;//V操作
    sopv.sem_flg=0;
    time_t start,end;
    start=time(NULL);//开始计时
    if(!fork())
    {
        for(i=0;i<NUM;i++)
        {
            semop(sem_id,&sopp,1);//P操作加锁
            p[0]++;
            semop(sem_id,&sopv,1);//V操作解锁
        }
        return 0;
    }
    else{
        for(i=0;i<NUM;i++)
        {
            semop(sem_id,&sopp,1);//P操作加锁
            p[0]++;
            semop(sem_id,&sopv,1);//V操作解锁
        }
        wait(NULL);//等待子进程
        end=time(NULL);//结束计时
        printf("p[0]=%d,use time=%ld\n",p[0],end-start);
        return 0;
    }
}